package com.clientservice;

import com.qqcommon.Message;
import com.qqcommon.MessageType;
import com.qqcommon.User;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;

/**
 * @author wty
 * @date 2022/10/25 14:14
 * 用于登录和注册
 */
@SuppressWarnings({"all"})
public class UserClientService {
    // 会在其它地方使用，所以这里把User做成成员属性
    private User user = new User();
    // 会在其它地方使用，所以这里把Socket做成成员属性
    private Socket socket = null;
    private boolean flag = false;


    // 根据用户输入的userID和password去服务器端验证是否合法
    public boolean checkUser(String userID, String password) throws Exception {
        user.setUserID(userID); // 这里已经给user对象的userID赋值了
        user.setPassword(password);
        // 连接到服务端，发送user对象

        socket = new Socket(InetAddress.getLocalHost(), 9999); // 这里输入IP即可
        // 这里用对象流构建可以把成员属性一起传递
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
        objectOutputStream.writeObject(user);
        // objectOutputStream.flush();
        // socket.shutdownOutput();

        // 读取从服务器端回复的Message对象,同样用对象流
        ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());
        // 这里要强制转换一下对象
        Object o = objectInputStream.readObject();
        Message message = (Message) o; // 向下转型

        // 将从数据通道获取的消息类型与接口MessageType中的比较
        // 成功
        if (message.getType().equals(MessageType.MESSAGE_LOGIN_SUCCEED)) {
            // 登录成功
            // 创建启动一个线程与服务端连接,并且保持通信 ClientConnectServerThread
            // 先等待
            ClientConnectServerThread clientConnectServerThread = new ClientConnectServerThread(socket);
            clientConnectServerThread.start();

            // 为了客户端的扩展，将线程放到一个集合中管理
            ManageClientConnectServerThread.add(userID, clientConnectServerThread);
            flag = true;

        } else {
            // 如果验证登录名和密码不匹配，则关闭socket
            socket.close();
        }


        // objectInputStream.close();
        // objectOutputStream.close();
        //socket.close();
        return flag;
    }

    // 向服务器请求用户在线列表
    public void onlineFriendList() throws Exception {
        // 发送一个Message ,类型是    String MESSAGE_LOGIN_ONLINEFRIEND= "3"; // 要求返回在线用户列表
        Message message = new Message();
        message.setType(MessageType.MESSAGE_ONLINEFRIEND);
        message.setSender(user.getUserID());

        // 发送给服务器
        // 应该得到当前线程对应的socket的ObjectOutput对象
        // 从集合中获取对象
        ClientConnectServerThread clientConnectServerThread = ManageClientConnectServerThread.get(user.getUserID());
        // 获取线程对象持有的socket 以及其输出流
        OutputStream outputStream = clientConnectServerThread.getSocket().getOutputStream();
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
        // 发送message对象
        objectOutputStream.writeObject(message);

    }

    // 编写方法退出子线程:给服务端发送退出指令
    public void logout() throws Exception {
        Message message = new Message();
        message.setType(MessageType.MESSAGE_EXIT);
        message.setSender(user.getUserID()); // 一定要指定发送方

        //方法一: 直接从socket获取到对象流
        //ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());

        //方法二: 从集合中获取socket从而获取对象流
        ClientConnectServerThread clientConnectServerThread = ManageClientConnectServerThread.get(user.getUserID());
        Socket threadSocket = clientConnectServerThread.getSocket();
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(threadSocket.getOutputStream());

        //ObjectOutputStream objectOutputStream = new ObjectOutputStream(ManageClientConnectServerThread.get(user.getUserID()).getSocket().getOutputStream());

        objectOutputStream.writeObject(message);
        System.out.println(user.getUserID() + "：退出了系统");
        System.exit(0); // 结束进程
    }


}
